package com.mdr.imedera.util.request;

import com.mdr.imedera.util.wx.AccessToken;
import jdk.internal.dynalink.beans.StaticClass;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * @Author wxb
 * @Datatime 2020/10/19 16:51
 * @Descript java发送请求的工具类
 */
@Slf4j
public class RequestUtils {



    /**
     * 分页查询，获取开始位置
     * @param pageIndex
     * @param pageSize
     * @return
     */
    public static Integer getOffset(Integer pageIndex,Integer pageSize){
        return (pageIndex-1)*pageSize;
    }



    /**
     * get方式请求数据接口
     * * @param url 请求路径
     * @param params 请求参数
     * @return 请求的返回结果
     */
    public static String getRequest(String url,Map<String,String> params){
        //将请求参数追加到请求路径的尾部
        url = formateGetParams(params, url);
        //返回请求结果
        return getRequest(url);
    }

    /**
     * get方式请求数据接口
     * @param url 请求路径
     * @return 请求的返回结果
     */
    public static String getRequest(String url){
        return getSend(url);
    }

    /**
     * 将请求参数 追加到请求路径Url的末尾.
     * @param params
     * @param url
     * @return
     */
    private static String formateGetParams(Map<String,String> params,String url){
        //如果请求参数的长度为0，则URL不需要处理，直接返回
        if(params.size()==0){
            return url;
        }
        //遍历Map集合
        String paramsStr = "";
        for(Map.Entry<String,String> entry: params.entrySet()){
            paramsStr += entry.getKey() + "="+ entry.getValue()+"&";
        }
        //去除最后一个字符"&"后追加到 url上
        url = url + paramsStr.substring(0,paramsStr.length()-1);
        log.info("带params的请求URL:{}",url);
        return url;
    }

//    /**
//     * GET方式请求数据接口(此处还可以跟post请求方式进行优化，根据method方式进行区分请求配置就好，下次看见了再修改吧)
//     * @param url get 方式的接口地址
//     * @return 请求结果
//     */
//    private static String getSend(String url){
//        PrintWriter out = null;
//        BufferedReader in = null;
//        String result ="";
//        try {
//            URL reqUrl = getUrl(url);
//            //打开链接
//            URLConnection conn = reqUrl.openConnection();
//            //通用配置
//            conn =setRequestProperty(conn);
//            // 获取URLConnection对象对应的输出流
//            out = new PrintWriter(conn.getOutputStream());
//            // flush输出流的缓冲
//            out.flush();
//            // 定义BufferedReader输入流来读取URL的响应
//            in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
//            String line;
//            while ((line = in.readLine()) != null) {
//                result += line;
//            }
//        } catch (MalformedURLException e) {
//            e.printStackTrace();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }finally {
//            try {
//                if (out != null) {
//                    out.close();
//                }
//                if (in != null) {
//                    in.close();
//                }
//            } catch (IOException ex) {
//                ex.printStackTrace();
//            }
//        }
//        return result;
//    }

    /**
     * GET方式请求数据接口(此处还可以跟post请求方式进行优化，根据method方式进行区分请求配置就好，下次看见了再修改吧)
     * @param url get 方式的接口地址
     * @return 请求结果
     */
    public static String getSend(String url){
        return sendRequest(url,"get","");
    }

    /**
     * post方式请求 带Map集合参数
     * @param url 请求地址
     * @param params 请求参数
     * @return
     */
    public static String postSend(String url,Map<String,String> params){
        //1.将请求参数拼接成字符串
        String paramStr = "";
        Iterator<String> it = params.keySet().iterator();
        while (it.hasNext()) {
            String key = it.next();
            paramStr += key + "=" + params.get(key) + "&";
        }
        paramStr = paramStr.substring(0, paramStr.length() - 1);//取消末尾的&符号;
        return postSend(url,paramStr);
    }

    public static String postSend(String url,String params){
        return sendRequest(url,"post",params);
    }

    private static String sendRequest(String url,String method,String params){
        PrintWriter out = null;
        BufferedReader in = null;
        String result ="";
        try {
            URL reqUrl = getUrl(url);
            //打开链接
            URLConnection conn = reqUrl.openConnection();
            //通用配置
            conn =setRequestProperty(conn);
            // 获取URLConnection对象对应的输出流
            out = new PrintWriter(conn.getOutputStream());
            //如果是post方式，需要请求参数
            if("post".equals(method)&&params.length()>0){
                // 发送请求参数
                out.print(params);
            }
            // flush输出流的缓冲
            out.flush();
            // 定义BufferedReader输入流来读取URL的响应
            in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if (out != null) {
                    out.close();
                }
                if (in != null) {
                    in.close();
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        return result;
    }

    /**
     * 设置请求头信息，适用于get和post
     * @param conn
     * @return
     */
    private static URLConnection setRequestProperty(URLConnection conn){
        //设置通用的请求属性
        conn.setRequestProperty("accept", "*/*");
        conn.setRequestProperty("connection", "Keep-Alive");
        conn.setRequestProperty("Accept-Charset", "utf-8");
        conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
        conn.setDoOutput(true);
        conn.setDoInput(true);
        return conn;
    }



    /**
     * 创建URL对象
     * @param url
     * @return
     * @throws MalformedURLException
     */
    private static URL getUrl(String url) throws MalformedURLException {
        return new URL(url);
    }

}
